﻿package aidn.animation.controller 
{
	
	import aidn.animation.model.Snow;
	import caurina.transitions.Tweener;
	import flash.display.Sprite;
	import flash.filters.GlowFilter;
	
	/**
	 * 雪を降らせます。
	 */
	public class SnowManager extends Sprite
	{
		// [Methods]
		//
		// SnowManager ( )
		// addSnow ( num :uint, stw :uint, sth :uint, isDown :Boolean = true )
		// setSnow( num :uint, stw :uint, sth :uint, isDown :Boolean = true )
		// 
		// setGlow ( cols :/*uint*/Array )
		// resetGlow ( )
		// setStageSize ( stw :uint, sth :uint )
		
		
		private var _num  :uint;
		private var _snow :/*Snow*/Array;
		
		
		public function SnowManager ( ) :void 
		{
			_num = 0;
			
			//// filters = [ new GlowFilter(0xffddaa) ];
		}
		
		// ------------------------------------------------------------------- public methods
		/**
		 * 雪の個数を追加します。
		 * @param	num		追加する個数。
		 * @param	stw		stageWidth
		 * @param	sth		stageHeight
		 * @param	isDown	落下方向。
		 */
		public function addSnow ( num :uint, stw :uint, sth :uint, isDown :Boolean = true ) :void
		{
			_num  += num;
			if ( ! _snow ) _snow = [];
			
			for ( var i :uint = 0; i < num; i ++ )
			{
				var snow :Snow = new Snow( stw, sth, isDown );
				addChild( snow );
				
				_snow.push( snow );
			}
		}
		
		/**
		 * 雪の個数を調整します。
		 * @param	num		個数。
		 * @param	stw		stageWidth
		 * @param	sth		stageHeight
		 * @param	isDown	落下方向。
		 */
		public function setSnow( num :uint, stw :uint, sth :uint, isDown :Boolean = true ) :void
		{
			var i :uint;
			
			if ( ! _snow ) _snow = [];
			
			if ( _num < num )		// 増やす
			{
				var n :uint = num - _num;		// + n
				
				for ( i = 0; i < n; i ++ )
				{
					var snow :Snow = new Snow( stw, sth, isDown );
					addChild( snow );
					_snow.push( snow );
				}
			}
			else if ( num < _num )	// 減らす
			{
				for ( i = _num - 1; num <= i; i -- )
				{
					Tweener.addTween( _snow[i], { alpha: 0, time: 0.3, transition: "linear",
						onComplete: function ( ) :void
						{
							// 破棄
							var s :Snow = this;
							removeChild( s );
							s = null;
						} } );
						
					_snow.pop();
				}
			}
			
			_num = num;
		}
		
		/**
		 * Glow をセットします。
		 * @param	cols	色配列(ランダム選択)。
		 */
		public function setGlow ( cols :/*uint*/Array ) :void
		{
			var l :int = cols.length;
			
			for (var i :int = 0; i < _num; i ++)
				_snow[i].filters = [ new GlowFilter( cols[ Math.floor( Math.random() * l ) ] ) ];
		}
		/**
		 * Glow をリセットします。
		 */
		public function resetGlow ( ) :void
		{
			for (var i :int = 0; i < _num; i ++) _snow[i].filters = [];
		}
		
		/**
		 * 
		 * @param	stw		stageWidth
		 * @param	sth		stageHeight
		 */
		public function setStageSize ( stw :uint, sth :uint ) :void
		{
			for ( var i :int = 0; i < _num; i ++ ) _snow[i].setStageSize( stw, sth );
		}
	}
}